/*
 * Copyright 2008 the Breachwalls OSS project and the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package com.breachwalls.mogen.model;

import org.apache.commons.lang.StringUtils;

import com.breachwalls.mogen.xml.bean.ModelClassProperty;

/**
 * 汎用モデルのプロパティ.
 * @author todoken
 * @version $Revision: 31 $
 */
public class GenericModelProperty implements ModelProperty {

    /**
     * モデルクラスのプロパティのXML定義.
     */
    private ModelClassProperty modelClassProperty;

    /**
     * 関連モデル.
     */
    private Model model;

    /**
     * コンストラクタ.
     * @param newModelClassProperty モデルクラスのプロパティのXML定義
     */
    public GenericModelProperty(ModelClassProperty newModelClassProperty) {
        this.modelClassProperty = newModelClassProperty;
    }

    /**
     * モデルクラスのプロパティのXML定義を取得する.
     * @return モデルクラスのプロパティのXML定義
     */
    protected ModelClassProperty getModelClassProperty() {
        return modelClassProperty;
    }

    /**
     * プロパティ名を取得する.
     * @return プロパティ名
     */
    public String getName() {
        return getModelClassProperty().getName();
    }

    /**
     * 説明文を取得する.
     * @return 説明文
     */
    public String getDescription() {
        String description = getModelClassProperty().getDescription();
        if (StringUtils.isBlank(description)) {
            if (getModel() != null) {
                return getModel().getDescription();
            }
        }
        return description;
    }

    /**
     * プロパティの型を取得する.
     * @return プロパティの型
     */
    public String getType() {
        return getModelClassProperty().getType();
    }

    /**
     * 値を取得する.
     * @return 値
     */
    public String getValue() {
        return getModelClassProperty().getValue();
    }

    /**
     * スペックを取得する.
     * @return スペック
     */
    public String[] getSpecs() {
        String[] specs = getModelClassProperty().getSpecs();
        if (specs != null) {
            String[] newSpecs = new String[specs.length];
            for (int i = 0; i < specs.length; i++) {
                newSpecs[i] = StringUtils.trim(StringUtils.upperCase(specs[i]));
            }
            return newSpecs;
        }
        return null;
    }

    /**
     * 関連モデルを取得する.<br>
     * ない場合は、NULLを返す.
     * @return 関連モデル
     */
    public Model getModel() {
        return model;
    }

    /**
     * 関連モデルを設定する.
     * @param newModel 関連モデル
     */
    public void setModel(Model newModel) {
        this.model = newModel;
    }

}
